package com.chen.springboot.common;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author Chen
 * @Date 2024/11/2 11:43
 */
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {

    private static final String secretKey = "chen";

//    @Override
//    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//        HttpServletRequest req = (HttpServletRequest) request;
//        HttpServletResponse resp = (HttpServletResponse) response;
//
//        //1.获取请求url。
//        String url = req.getRequestURL().toString();
//
//        if (url.contains("login")||url.contains("files")||url.contains("manageLogin") ||
//            url.contains("register")||url.contains("download")||url.contains("swagger")||
//            url.contains("webjars")||url.contains("v2")){
//            chain.doFilter(request, response);
//            return;
//        }
//
//        //3.获取请求头中的令牌（token）。
//        String jwt = req.getHeader("Authorization");
//        // 验证 token 格式，如果为空，那么从url参数里面里面拿
//        if (StrUtil.isBlank(jwt))
//            jwt = request.getParameter("Authorization");
//
//        //4.判断令牌是否存在，如果不存在，返回错误结果（未登录）。
//        if (!StringUtils.hasLength(jwt)) {
//            Result error = Result.error("401", "NOT_LOGIN");
//            //手动转换 对象--json --------> 阿里巴巴fastJSON
//            String notLogin = JSONObject.toJSONString(error);
//            resp.getWriter().write(notLogin);
//            return;
//        }
//
//        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
//
//        //5.解析token，如果解析失败，返回错误结果（未登录）。
//        try {
//            jwtVerifier.verify(jwt);
//        } catch (Exception e) {//jwt解析失败
//            e.printStackTrace();
//            Result error = Result.error("401", "NOT_LOGIN");
//            //手动转换 对象--json --------> 阿里巴巴fastJSON
//            String notLogin = JSONObject.toJSONString(error);
//            resp.getWriter().write(notLogin);
//            return;
//        }
//
//        //6.放行。
//        chain.doFilter(request, response);
//
//    }
//@Override
//public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//    HttpServletRequest req = (HttpServletRequest) request;
//    HttpServletResponse resp = (HttpServletResponse) response;
//
//    // CORS处理
//    String origin = req.getHeader("Origin");
//    if (origin != null && !"".equals(origin)) {
//        resp.setHeader("Access-Control-Allow-Origin", origin);
//    }
//    resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
//    // 注意这里！！！加上 x-access-token
//    resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Access-Token");
//    resp.setHeader("Access-Control-Allow-Credentials", "true");
//
//    // 预检请求（OPTIONS）直接返回
//    if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
//        resp.setStatus(HttpServletResponse.SC_OK);
//        return;
//    }
//
//    // 后面是你原来的登录拦截逻辑
//    String url = req.getRequestURL().toString();
////    if (url.contains("login") || url.contains("files") || url.contains("manageLogin") ||
////            url.contains("register") || url.contains("download") || url.contains("swagger") ||
////            url.contains("webjars") || url.contains("v2"))
////    {
////        chain.doFilter(request, response);
////        return;
////    }
//    if (
//            url.contains("login") ||
//                    url.contains("files") ||
//                    url.contains("manageLogin") ||
//                    url.contains("register") ||
//                    url.contains("download") ||
//                    url.contains("swagger") ||
//                    url.contains("webjars") ||
//                    url.contains("v2") ||
//                    url.contains("/shop") ||
//                    url.contains("/shop/detail") ||
//                    url.contains("/index") ||
//                    url.contains("/api/preview")
//    ) {
//        chain.doFilter(request, response);
//        return;
//    }
//
//    String jwt = req.getHeader("Authorization");
//    if (StrUtil.isBlank(jwt))
//        jwt = request.getParameter("Authorization");
//
//    if (!StringUtils.hasLength(jwt)) {
//        Result error = Result.error("401", "NOT_LOGIN");
//        String notLogin = JSONObject.toJSONString(error);
//        resp.getWriter().write(notLogin);
//        return;
//    }
//
//    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
//
//    try {
//        jwtVerifier.verify(jwt);
//    } catch (Exception e) {
//        e.printStackTrace();
//        Result error = Result.error("401", "NOT_LOGIN");
//        String notLogin = JSONObject.toJSONString(error);
//        resp.getWriter().write(notLogin);
//        return;
//    }
//
//    chain.doFilter(request, response);
//}
//
//}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // CORS设置
        String origin = req.getHeader("Origin");
        if (origin != null && !"".equals(origin)) {
            resp.setHeader("Access-Control-Allow-Origin", origin);
        }
        resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Access-Token");
        resp.setHeader("Access-Control-Allow-Credentials", "true");

        // 预检请求放行
        if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
            resp.setStatus(HttpServletResponse.SC_OK);
            return;
        }

//        String url = req.getRequestURI();
//
//        // 定义不需要登录验证的路径白名单
//        if (url.contains("/login")
//                || url.contains("/register")
//                || url.contains("/shop")
//                || url.contains("/swagger")
//                || url.contains("/files")
//                || url.contains("/manageLogin")
//                || url.contains("/download")) {
//            chain.doFilter(request, response);
//            return;
//        }
//
//        // 获取请求头Authorization
//        String jwt = req.getHeader("Authorization");
//        if (jwt != null && jwt.startsWith("Bearer ")) {
//            jwt = jwt.substring(7);  // 去掉Bearer前缀
//        }
//
//        // 如果token为空，则返回未登录错误
//        if (!StringUtils.hasLength(jwt)) {
//            Result error = Result.error("401", "NOT_LOGIN");
//            resp.setContentType("application/json;charset=utf-8");
//            resp.getWriter().write(JSONObject.toJSONString(error));
//            return;
//        }
//
//        // 验证token有效性
//        try {
//            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
//            jwtVerifier.verify(jwt);
//        } catch (Exception e) {
//            Result error = Result.error("401", "NOT_LOGIN");
//            resp.setContentType("application/json;charset=utf-8");
//            resp.getWriter().write(JSONObject.toJSONString(error));
//            return;
//        }

        // 验证通过，放行
        chain.doFilter(request, response);
    }
}
